package com.weixin.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import me.chanjar.weixin.common.util.StringUtils;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;

import org.apache.log4j.Logger;

import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.weixin.model.AppUser;
import com.weixin.service.WxWyPublicService;

/*******************************************
 * 作用描述：网欣物业对外公众服务后台服务层
 ******************************************* 
 * @author LRC
 * @createDate 2015-9-20
 * @version v1.0
 * @updateRecord 格式：时间，作者，修改说明
 ******************************************* 
 * 
 */
public class WxWyPublicContoller extends Controller {

	public static Logger log = Logger.getLogger(WxWyPublicContoller.class);

	public void index() throws IOException {
		// 获取请求 和 响应对象
		HttpServletRequest request = this.getRequest();
		HttpServletResponse response = this.getResponse();
	
		response.setContentType("text/html;charset=utf-8");
		response.setStatus(HttpServletResponse.SC_OK);
	
		// 获取验证参数
		String signature = request.getParameter("signature");
		String nonce = request.getParameter("nonce");
		String timestamp = request.getParameter("timestamp");
		System.out.println("signature : "+signature);
		System.out.println("nonce : "+nonce);
		System.out.println("timestamp : "+timestamp);
		
		if (!WxWyPublicService.checkSignature(timestamp, nonce, signature)) {
			// 消息签名不正确，说明不是公众平台发过来的消息
			renderJson("非法请求");
			return;
		}
	
		String echostr = request.getParameter("echostr");
		System.out.println("echostr : "+echostr);
		if (StringUtils.isNotBlank(echostr)) {
			// 说明是一个仅仅用来验证的请求，回显echostr
			renderJson(echostr);
			return;
		}
		// 获取加密方式
		String encryptType = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type");
		// 输入内容
		WxMpXmlMessage inMessage;
		// 输出内容
		WxMpXmlOutMessage outMessage;
		// 加密分支处理
		switch (encryptType) {
			case "raw":
				// 明文传输的消息
				inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
				System.out.println(inMessage);
				if(inMessage==null){
					renderJson("");
					return;
				}
				//首先采用消息路由规则
				String fromUserName = inMessage.getFromUserName();
				
				outMessage = WxWyPublicService.route(inMessage);
				if(outMessage==null){
					// TODO 如果没有找到路由数据
					renderJson("");
				}else{
					renderJson(outMessage.toXml());
				}
				break;
			case "ase":
				// 是aes加密的消息
				String msgSignature = request.getParameter("msg_signature");
				inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(), WxWyPublicService.getWxMpInMemoryConfigStorage(), timestamp, nonce, msgSignature);
				System.out.println(inMessage);
				outMessage = WxWyPublicService.route(inMessage);
				if(outMessage==null){
					// TODO 如果没有找到路由数据
					System.out.println("没有找到对应的请求路由");
					renderJson("");
				}else{
					renderJson(outMessage.toEncryptedXml(WxWyPublicService.getWxMpInMemoryConfigStorage()));
				}
				break;
			default:
				renderJson("不可识别的加密类型");
				break;
		}
	}
	
	/**
	 * url授权验证请求重定向页面请求处理_跳转到后台主页
	 * @updateTeim 2015年9月27日下午9:48:04
	 * @description 
	 */
	public void urlRedirect_dims(){
		//TODO 此方法暂无其他用处，保留
		
		//获取进入模块名称
		String code = getPara("code");
		String state = getPara("state");
		if(StrKit.isBlank(code)||!WxWyPublicService.validateState(state)){
			renderError(404);
		}
		
		//判断用户是否绑定
		AppUser appUser = WxWyPublicService.getAppUserByCode(code);
		
		if(appUser==null){
			renderError(500);
		}else if(appUser.get("id")==null){
			//返回绑定界面
			setSessionAttr("appUser", appUser);
			redirect("/wxwyapp/user/toBindWeiXin");
		}else{
			//设置session对象并根据用户类型跳转到对应的界面
			setSessionAttr("appUser", appUser);
			//直接到登录，进行登录跳转
			redirect("/wxwyapp/user/login");
		}
	}
}
